ORDER BY句とDISTINCTとは?おーだーばいくとでぃすてぃんくと
ORDER BYは結果行の並び順を、DISTINCTは結果からの重複行の除去を指定する。DISTINCTの重複判定はSELECTした列の組合せ全体で行われる。どちらも実行時にはソートかハッシュによる突合を伴うため、行数が増えるほど作業領域と時間を消費し、索引の有無が実行計画を左右する。
最終更新:2026-10-06
この語が出る過去問を解く →背景
リレーショナルモデルでは表は行の集合であり、集合には順序が無い。だからSQLは並び順を保証せず、必要なら明示せよという設計になっている。一方で実際のSQLの表は重複行を許すマルチ集合なので、集合として扱いたい場面のために重複除去の指定が別に用意された。どちらも「モデルと実装の食い違いを利用者が埋める」ための句だと捉えると、なぜ書かないと保証されないのかが説明できる。
具体例
PostgreSQLでEXPLAIN ANALYZEを取ると、ORDER BYはSortノードとして現れ、対象が作業メモリ(work_mem)に収まらなければ外部ソートとしてディスクへ書き出す様子まで見える。並び順どおりの索引があればSortノード自体が消え、Index Scanで済む。DISTINCTはHashAggregateかSort+Uniqueとして現れ、同じ結果でも行数と作業メモリ次第で計画が入れ替わる。
試験での引っ掛け
DISTINCTは指定した1列ではなく選択列の組合せ全体で重複を見るため、列を1つ足しただけで重複が消えなくなる。GROUP BYと結果が同じに見えても、集約関数を伴う集計とは目的が違う。ORDER BYを書かなければ同じ問合せでも実行のたびに並びが変わり得る点、ORDER BYは論理的に最後に評価されるためSELECTで付けた別名が使える点も出題される。
関連用語
出た過去問
問題文で直接問われたものと、解説の中で触れられたものが含まれます。
出典:平成29年度 秋期 応用情報技術者試験 午前 問28(IPA)
関係R(ID, A, B, C)のA, Cへの射影の結果とSQL文で求めた結果が同じになるように、aに入れるべき字句はどれか。ここで、関係Rを表Tで実現し、表T…
正解:DISTINCT
要点:関係代数の射影は重複を除くのでSQLではDISTINCTが要る
関係代数の射影は集合演算なので、結果に重複する行は現れない。一方SQLのSELECTは既定で重複行をそのまま返すため、A列とC列だけを取り出すと同じ値の組が複数出てしまう。重複を取り除くDISTINCTを指定することで、射影の結果と一致させられる。
出典:令和3年度 秋期 応用情報技術者試験 午前 問29(IPA)
“部門別売上”表から、部門コードごと、期ごとの売上を得るSQL文はどれか。
正解:SELECT 部門コード, '第1期' AS 期, 第1期売上 AS 売上 FROM 部門別売上 UNION (SELECT 部門コード, '第2期' AS 期, 第2期売上 AS 売上 FROM 部門別売上) ORDER BY 部門コード, 期
要点:横持ちを縦持ちに変換するにはUNIONで行を連結する
1行に第1期と第2期の売上が横に並んだ表を、期ごとの縦持ちに変換したい。第1期を取り出す問合せと第2期を取り出す問合せをそれぞれ作り、UNIONで行方向に連結すれば求める結果になる。UNIONは列数と列のデータ型が一致していれば結果を縦に結合できる。
出典:令和4年度 秋期 応用情報技術者試験 午前 問28(IPA)
“商品”表に対して、次のSQL文を実行して得られる仕入先コード数は幾つか。 〔SQL文〕 SELECT DISTINCT 仕入先コード FROM 商品 WHER…
正解:3
要点:副問合せの平均値と比較しDISTINCTで重複を除く
各行の利益(販売単価−仕入単価)は200, 200, 100, 900, 400, 200, 300, 500, 500, 300で、合計3,600、平均は360です。これを上回るのは900のD004、400のE005、500のH008、500のI009の4行で、仕入先コードはS1・S1・S4・S5。DISTINCTで重複を除くとS1、S4、S5の3件になります。
出典:令和5年度 秋期 応用情報技術者試験 午前 問28(IPA)解説で登場
更新可能なビューを作成するSQL文はどれか。ここで、SQL文中に現れる基底表は全て更新可能とする。
正解:CREATE VIEW 高額商品(商品番号, 商品名, 商品単価) AS SELECT 商品番号, 商品名, 商品単価 FROM 商品 WHERE 商品単価>1000
要点:更新可能ビューは単一表の選択と射影に限られる
ビューが更新可能であるためには、ビューの各行が基底表の1行に一意に対応し、更新内容を基底表へ一意に反映できる必要がある。単一の表からWHERE句で行を絞り、列をそのまま射影しただけのビューはこの条件を満たすので更新可能である。DISTINCT、GROUP BY、集約関数を含むビューは元の行との対応が失われるため更新できない。
出典:令和5年度 秋期 応用情報技術者試験 午前 問29(IPA)
“製品”表と“在庫”表に対し、次のSQL文を実行した結果として得られる表の行数は幾つか。SELECT DISTINCT 製品番号 FROM 製品 WHERE N…
正解:2
要点:NOT EXISTSは副問合せが空になる行だけを残す
NOT EXISTSは、相関副問合せが1行も返さない製品だけを残す。在庫数が30を超える行を持つ製品はAB1805(150)、CC5001(200と40)、ZZ9900(130)の3つで、XZ3000は30と20なので条件を満たさず、MZ1000は在庫表に行がない。したがって結果に残るのはMZ1000とXZ3000の2行である。
出典・参考
解説は資格暗記が独自に作成しています。過去問の出典は各問題に記載のとおりです。